#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct Nodo{
    int dato;
    struct Nodo *siguiente;
}Nodo;

typedef struct {
    Nodo *inicio;
} Cola;

void inicializacion (Cola * tas){
    tas->inicio = NULL;
}

int encolar (Cola * tas, int dato){
    Nodo *nuevo_elemento;
    Nodo *actual;

    nuevo_elemento = (Nodo *) malloc (sizeof (Nodo));

    nuevo_elemento->dato= dato;
    nuevo_elemento->siguiente =NULL;


   if(tas->inicio==NULL)
   {
     tas->inicio=nuevo_elemento;
   }
   else
   {
       actual=tas->inicio;
       while(1)
       {
           if(actual->siguiente==NULL)
           {
               break;

           }
            actual=actual->siguiente;
       }
          actual->siguiente=nuevo_elemento;
   }
}

int desencolar (Cola * tas){
    Nodo *sup_elemento;
    if (tas->inicio==NULL)
        return -1;
    sup_elemento = tas->inicio;
    tas->inicio = tas->inicio->siguiente;
    free (sup_elemento);
    return 0;
}

void muestra (Cola * tas){
    Nodo *actual;

    actual = tas->inicio;
   if (actual==NULL) return;
    while(1)
    {
        cout<< actual->dato <<endl;
        if (!actual->siguiente) break;
        actual = actual->siguiente;
    }
}

int main()
{
    Cola *tas;
    int nom;
    int i;

    if ((tas = (Cola *) malloc (sizeof (Cola))) == NULL)
        return -1;

    inicializacion (tas);

    for(i=0;i<3;i++)
    {
        cout <<"Ingrese un numero: ";
        cin>> nom;
        encolar (tas, nom);
        cout<<endl<<"********** Comienzo de Cola **********"<<endl;
        muestra(tas);
        cout<<endl<<"**********    Fin de Cola   **********"<<endl<<endl;
    }


    cout<<endl<<"Elimino el Primer nodo (FirstInFirstOut)";
    desencolar (tas);
    cout<<endl<<"********** Comienzo de Cola **********"<<endl;
    muestra(tas);
    cout<<endl<<"**********    Fin de Cola   **********"<<endl<<endl;

    return 1;
}
